package com.sky.service.impl;

import cn.mybatis.mp.core.sql.executor.chain.QueryChain;
import com.sky.dto.BookCategoryStatisticsDTO;
import com.sky.entity.Bookcategories;
import com.sky.entity.Categories;
import com.sky.mapper.BookcategoriesMapper;
import com.sky.mapper.CategoriesMapper;
import com.sky.service.BookCategoryStatisticsService;
import com.sky.vo.BookCategoryStatisticsVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 图书分类统计Service实现类
 */
@Service
@Slf4j
public class BookCategoryStatisticsServiceImpl implements BookCategoryStatisticsService {

    @Autowired
    private BookcategoriesMapper bookcategoriesMapper;
    
    @Autowired
    private CategoriesMapper categoriesMapper;

    /**
     * 获取图书分类统计信息
     * @param dto 统计查询条件
     * @return 分类统计结果列表
     */
    @Override
    public List<BookCategoryStatisticsVO> getCategoryStatistics(BookCategoryStatisticsDTO dto) {
        // 获取所有分类
        List<Categories> categories = QueryChain.of(categoriesMapper).list();
        
        // 统计每个分类的图书数量并转换为VO
        List<BookCategoryStatisticsVO> allStats = categories.stream()
            .map(category -> {
                // 统计该分类下的图书数量
                long bookCount = QueryChain.of(bookcategoriesMapper)
                    .where(w -> w.eq(Bookcategories::getCategoryId, category.getCategoryId()))
                    .count();
                    
                // 构建VO对象
                return BookCategoryStatisticsVO.builder()
                    .name(category.getCategoryName())
                    .value((int) bookCount)
                    .build();
            })
            .collect(Collectors.toList());

        // 按图书数量降序排序
        allStats.sort(Comparator.comparing(BookCategoryStatisticsVO::getValue).reversed());

        // 处理结果，只取前5个分类，其余归为"其他"
        List<BookCategoryStatisticsVO> result = new ArrayList<>();
        
        // 如果总分类数大于5，需要处理"其他"类别
        if (allStats.size() > 7) {
            // 添加前5个分类
            result.addAll(allStats.subList(0, 7));
            
            // 计算其他分类的总数
            int othersCount = allStats.stream()
                .skip(7)
                .mapToInt(BookCategoryStatisticsVO::getValue)
                .sum();
            
            // 添加"其他"类别
            if (othersCount > 0) {
                result.add(BookCategoryStatisticsVO.builder()
                    .name("其他")
                    .value(othersCount)
                    .build());
            }
        } else {
            // 如果总分类数不超过5个，直接返回全部
            result = allStats;
        }

        return result;
    }
} 